/**
 * sort() 方法就地对数组的元素进行排序，并返回对相同数组的引用。默认排序是将元素转换为字符串，然后按照它们的 UTF-16 码元值升序排序。
 * 注意：不传比较函数，则转成字符串再比较
 *
 * 本地排序：
 * localeCompare() 方法包含一个参数，指定要比较的目标字符串。如果当前字符串小于参数字符串，
 * 则返回小于 0 的数；如果大于参数字符串，则返回大于 0 的数；如果两个字符串相等，或与本地排序约定没有区别，则该方法返回 0。
 * 比如要中文按照拼音排序就用这个
 * @param {*} compareFn
 * @returns
 */
Array.prototype.mySort = function (compareFn) {
  if (!Array.isArray(this)) {
    throw new TypeError("must be called by array");
  }

  if (this.length < 2) return this;

  // 默认的比较方法
  const defaultCompareFn = function (a, b) {
    if (a > b) {
      return 1;
    }
    if (a < b) {
      return -1;
    }
    return 0;
  };

  compareFn = compareFn || defaultCompareFn;
  const newArr = [...this];

  // 使用快速排序算法进行排序
  function quickSort(arr) {
    if (arr.length <= 1) return arr;

    const leftArr = [];
    const rightArr = [];

    // const middleIndex = arr.length >> 1;
    const middleIndex = Math.ceil(arr.length / 2);
    const middleVal = arr.splice(middleIndex, 1)[0];

    // 计算中间值，大的放右边，小的放左边
    for (let i = 0; i < arr.length; i++) {
      if (compareFn(middleVal, arr[i]) === -1) {
        rightArr.push(arr[i]);
      } else {
        leftArr.push(arr[i]);
      }
    }

    return [...quickSort(leftArr), middleVal, ...quickSort(rightArr)];
  }

  const sortArr = quickSort(newArr);

  // 改变原数组1
  for (let i = 0; i < this.length; i++) {
    this[i] = sortArr[i];
  }

  return this;
};

// egg
const arr = [1, 3, 2, 4];
console.log("[ arr ] >", arr.mySort());

const arr1 = [1, 3, 2, 4];

console.log("[ arr1 ] >", arr1.sort());

// 按照拼音排序
let arr2 = ["张三", "李四", "王五"];
arr2.sort(function (a, b) {
  return a.localeCompare(b);
});

console.log("[ arr2 ] >", arr2);
